package main

import "fmt"

// 1. 计数器：使用闭包实现一个简单的计数器
// @Todo 定义哥函数func counter()
// @Todo func() int 返回一个函数，当前函数func 返回 int
func counter() func() int {
	count := 0
	// 返回一个闭包，它可以访问并修改count变量
	return func() int {
		count++
		return count
	}
}

// 2. 乘法器：创建一个可以乘以特定因子的函数
func multiplier(factor int) func(int) int {
	// 闭包捕获了factor变量
	return func(x int) int {
		return x * factor
	}
}

// 3. 累加器：每次可以累积加到指定初始值的函数
func accumulator(initial int) func(int) int {
	sum := initial
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	// 测试计数器
	count := counter()
	fmt.Println(count()) // 输出: 1
	fmt.Println(count()) // 输出: 2
	fmt.Println(count()) // 输出: 3

	// 测试乘法器
	double := multiplier(2)
	triple := multiplier(3)
	fmt.Println(double(5))  // 输出: 10
	fmt.Println(triple(5))  // 输出: 15
	fmt.Println(double(10)) // 输出: 20

	// 测试累加器
	acc := accumulator(100)
	fmt.Println(acc(10)) // 输出: 110
	fmt.Println(acc(20)) // 输出: 130
	fmt.Println(acc(30)) // 输出: 160
}
